/*
 * Universidade Federal de Campina Grande
 * Centro de Engenharia Eletrica e Informatica
 * Disciplina: Lab. de Engenharia de Software
 * Professora: Francilene Garcia
 * Sistema JudLaw-EI
 */
package judlawei.dbmanager.tests;

import java.util.ArrayList;
import java.util.List;

import judlaw.model.bean.docjud.Cabecalho;
import judlaw.model.bean.docjud.DocumentoJuridico;
import judlaw.model.bean.docjud.Ementa;
import judlaw.model.bean.docjud.Encerramento;
import judlaw.model.bean.docjud.Parte;
import judlaw.model.bean.docjud.Relatorio;
import judlaw.model.bean.docjud.Voto;
import judlawei.dbmanager.DocJudDB;

import org.junit.Before;
import org.junit.Test;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.*;

/**
 * Classe DocJudDBTest - testes das operacoes de Documento Juridico no BD
 * @author Vladymir Bezerra
 *
 */
public class DocJudDBTest {

    @Before
    public void setUp() throws Exception {
        DocJudDB docJudDB = new DocJudDB();
        docJudDB.removeDocJuds();
    }

    /**
     * Testa se a operacao de insercao esta Ok.
     */
    @Test
    public void testInsereDocJuridico() {

        DocJudDB docJudDB = new DocJudDB();

        DocumentoJuridico doc1 = new DocumentoJuridico();
        DocumentoJuridico doc2 = new DocumentoJuridico();
        DocumentoJuridico doc3 = new DocumentoJuridico();
        DocumentoJuridico doc4 = new DocumentoJuridico();

        doc1.setIdentificadorUnico("1");
        doc2.setIdentificadorUnico("2");
        doc3.setIdentificadorUnico("3");
        doc4.setIdentificadorUnico("3");

        Cabecalho cab1 = new Cabecalho();
        Cabecalho cab2 = new Cabecalho();
        Cabecalho cab3 = new Cabecalho();
        Cabecalho cab4 = new Cabecalho();

        Ementa ementa1 = new Ementa();
        Ementa ementa2 = new Ementa();
        Ementa ementa3 = new Ementa();
        Ementa ementa4 = new Ementa();

        Encerramento encerramento1 = new Encerramento();
        Encerramento encerramento2 = new Encerramento();
        Encerramento encerramento3 = new Encerramento();
        Encerramento encerramento4 = new Encerramento();

        List<Parte> parte1 = new ArrayList<Parte>();
        List<Parte> parte2 = new ArrayList<Parte>();
        List<Parte> parte3 = new ArrayList<Parte>();
        List<Parte> parte4 = new ArrayList<Parte>();

        parte1.add(new Parte("titulo1", "nome1"));
        parte2.add(new Parte("titulo2", "nome2"));
        parte3.add(new Parte("titulo3", "nome3"));
        parte4.add(new Parte("titulo4", "nome4"));

        Relatorio relatorio1 = new Relatorio("texto1");
        Relatorio relatorio2 = new Relatorio("texto2");
        Relatorio relatorio3 = new Relatorio("texto3");
        Relatorio relatorio4 = new Relatorio("texto4");

        List<Voto> voto1 = new ArrayList<Voto>();
        List<Voto> voto2 = new ArrayList<Voto>();
        List<Voto> voto3 = new ArrayList<Voto>();
        List<Voto> voto4 = new ArrayList<Voto>();

        voto1.add(new Voto("voto1"));
        voto2.add(new Voto("voto2"));
        voto3.add(new Voto("voto3"));
        voto4.add(new Voto("voto4"));

        /* Setando parametros do documento juridico */
        doc1.setCabecalho(cab1);
        doc2.setCabecalho(cab2);
        doc3.setCabecalho(cab3);
        doc3.setCabecalho(cab4);

        doc1.setEmenta(ementa1);
        doc2.setEmenta(ementa2);
        doc3.setEmenta(ementa3);
        doc3.setEmenta(ementa4);

        doc1.setEncerramento(encerramento1);
        doc2.setEncerramento(encerramento2);
        doc3.setEncerramento(encerramento3);
        doc4.setEncerramento(encerramento4);

        doc1.setPartes(parte1);
        doc2.setPartes(parte2);
        doc3.setPartes(parte3);
        doc4.setPartes(parte4);

        doc1.setRelatorio(relatorio1);
        doc2.setRelatorio(relatorio2);
        doc3.setRelatorio(relatorio3);
        doc4.setRelatorio(relatorio4);

        doc1.setVotos(voto1);
        doc2.setVotos(voto2);
        doc3.setVotos(voto3);
        doc4.setVotos(voto4);

        assertEquals(0, docJudDB.getListaDocumentos().size());
        docJudDB.insereDocJuridico(doc1);
        assertEquals(1, docJudDB.getListaDocumentos().size());
        docJudDB.insereDocJuridico(doc2);
        assertEquals(2, docJudDB.getListaDocumentos().size());
        docJudDB.insereDocJuridico(doc3);
        assertEquals(3, docJudDB.getListaDocumentos().size());
        docJudDB.insereDocJuridico(doc4);
        assertEquals(4, docJudDB.getListaDocumentos().size());
    }

    /**
     * Testa se uma lista de documentos juridicos esta sendo retornada.
     */
    @Test
    public void testGetListaDocumentos() {
        DocJudDB docJudDB = new DocJudDB();
        docJudDB.removeDocJuds();

        DocumentoJuridico doc1 = new DocumentoJuridico();
        DocumentoJuridico doc2 = new DocumentoJuridico();
        DocumentoJuridico doc3 = new DocumentoJuridico();
        DocumentoJuridico doc4 = new DocumentoJuridico();

        doc1.setIdentificadorUnico("1");
        doc2.setIdentificadorUnico("2");
        doc3.setIdentificadorUnico("3");
        doc4.setIdentificadorUnico("3");
        
        List<DocumentoJuridico> documentos = docJudDB.getListaDocumentos();
        assertEquals(0, documentos.size());
        
        docJudDB.insereDocJuridico(doc1);
        docJudDB.insereDocJuridico(doc2);
        docJudDB.insereDocJuridico(doc3);
        docJudDB.insereDocJuridico(doc4);
        
        documentos = docJudDB.getListaDocumentos();
        
        assertEquals(4, documentos.size());
        
    }
    
    /**
     * Testa se o cabecalho do documento juridico especifico esta sendo retornado.
     */
    @Test
    public void testGetCabecalhoByDocId() {
        DocJudDB docJudDB = new DocJudDB();
        docJudDB.removeDocJuds();
        
        DocumentoJuridico doc1 = new DocumentoJuridico();
        DocumentoJuridico doc2 = new DocumentoJuridico();
        DocumentoJuridico doc3 = new DocumentoJuridico();
        DocumentoJuridico doc4 = new DocumentoJuridico();

        doc1.setIdentificadorUnico("1");
        doc2.setIdentificadorUnico("2");
        doc3.setIdentificadorUnico("3");
        doc4.setIdentificadorUnico("4");

        Cabecalho cab1 = new Cabecalho("tribunal1","tipo1",1,"local1", "codRegistro1", "relator1");
        Cabecalho cab2 = new Cabecalho("tribunal2","tipo2",2,"local2", "codRegistro2", "relator2");
        Cabecalho cab3 = new Cabecalho("tribunal3","tipo3",3,"local3", "codRegistro3", "relator3");
        Cabecalho cab4 = new Cabecalho("tribunal4","tipo4",4,"local4", "codRegistro4", "relator4");
        
        doc1.setCabecalho(cab1);
        doc2.setCabecalho(cab2);
        doc3.setCabecalho(cab3);
        doc4.setCabecalho(cab4);
        
        docJudDB.insereDocJuridico(doc1);
        docJudDB.insereDocJuridico(doc2);
        docJudDB.insereDocJuridico(doc3);
        docJudDB.insereDocJuridico(doc4);
        
        assertEquals(cab1.getId(), docJudDB.getCabecalhoByDocId("1").getId());
        assertEquals(cab2.getId(), docJudDB.getCabecalhoByDocId("2").getId());
        assertEquals(cab3.getId(), docJudDB.getCabecalhoByDocId("3").getId());
        assertEquals(cab4.getId(), docJudDB.getCabecalhoByDocId("4").getId());
           
    }
    
    /**
     * 
     */
    @Test
    public void testRemoveDocumentoById() {
        DocJudDB docJudDB = new DocJudDB();
        docJudDB.removeDocJuds();
        
        DocumentoJuridico doc1 = new DocumentoJuridico();
        DocumentoJuridico doc2 = new DocumentoJuridico();
        DocumentoJuridico doc3 = new DocumentoJuridico();
        DocumentoJuridico doc4 = new DocumentoJuridico();

        doc1.setIdentificadorUnico("1");
        doc2.setIdentificadorUnico("2");
        doc3.setIdentificadorUnico("3");
        doc4.setIdentificadorUnico("4");
        
        docJudDB.insereDocJuridico(doc1);
        docJudDB.insereDocJuridico(doc2);
        docJudDB.insereDocJuridico(doc3);
        docJudDB.insereDocJuridico(doc4);
        
        /* testa se foi inserido corretamente */
        assertEquals(4, docJudDB.getListaDocumentos().size());
        
        /* testa se a remocao esta ok. */
        assertTrue(docJudDB.removeDocumentoById("1"));
        assertTrue(docJudDB.removeDocumentoById("2"));
        assertTrue(docJudDB.removeDocumentoById("3"));
        assertTrue(docJudDB.removeDocumentoById("4"));
        
        /* testa se a remocao esta ok */
        assertEquals(0, docJudDB.getListaDocumentos().size());

        /* testa remocoes invalidas */
        assertFalse(docJudDB.removeDocumentoById("1"));
        assertFalse(docJudDB.removeDocumentoById("2"));
        assertFalse(docJudDB.removeDocumentoById("3"));
        assertFalse(docJudDB.removeDocumentoById("4"));
    }
}
